﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Aplicacion.Clases;
using BussinesLayer.Clases;
using CustomControl;
using DTO.Clases;
using Utilities;

namespace Aplicacion.Inventario.Producto
{
    public partial class FrmIngresarProducto : Form
    {
        #region Atributos

        #region Logica de Negocio

        /// <summary>
        /// Objeto de logica de negocio Iva.
        /// </summary>
        BussinesIva miBussinesIva;

        /// <summary>
        /// Objeto de logica de negocio Descuento.
        /// </summary>
        BussinesDescuento miBussinesDescuento;

        /// <summary>
        /// Objeto de logica de negocio Recargo.
        /// </summary>
        BussinesRecargo miBussinesRecargo;

        /// <summary>
        /// Objeto de logica de negocio para Unidad de medida.
        /// </summary>
        private BussinesUnidadMedida bussinesUnidadMedida;

        /// <summary>
        /// Objeto de logica de negocio para los valores de unidad de medida.
        /// </summary>
        private BussinesValorUnidadMedida miBussinesValorUnidad;

        /// <summary>
        /// Representa un objeto de logica para Color.
        /// </summary>
        private BussinesColor miBussinesColor;

        /// <summary>
        /// objeto de logica de negocio de Producto.
        /// </summary>
        public BussinesProducto miBussinesProducto;

        /// <summary>
        /// Objeto de la clase Producto.
        /// </summary>
        DTO.Clases.Producto miProducto;

        #endregion

        #region Propiedades de Producto

        /// <summary>
        /// Obtiene o establece el valor del id de la Marca.
        /// </summary>
        private int idMarca = 0;

        /// <summary>
        /// Obtiene o estabelece el valor del codigo de la Categoria.
        /// </summary>
        private string codigoCategoria = "";

        /// <summary>
        /// Representa una lista de los Descuentos del Producto.
        /// </summary>
        private List<Descuento> listaDescuentos;

        /// <summary>
        /// Representa una lista de los Recargos del Producto.
        /// </summary>
        private List<Recargo> listaRecargos;

        /// <summary>
        /// Representa una lista de las medidas del producto.
        /// </summary>
        private List<ValorUnidadMedida> medidas;

        /// <summary>
        /// Objeto de coleccion para cargar inventario.
        /// </summary>
        private List<DTO.Clases.Inventario> inventarios;

        #endregion

        #region Utilidades

        /// <summary>
        /// Objeto para aplicar precios.
        /// </summary>
        private AplicarPrecio aplicaPrecio = new AplicarPrecio();
        
        /// <summary>
        /// Objeto para mostrar mensajes en los controles de formulario.
        /// </summary>
        private ToolTip miBtnTexto = new ToolTip();

        /// <summary>
        /// Objeto para que el usuario seleccione un color.
        /// </summary>
        private ColorDialog miColorDialog;

        /// <summary>
        /// Establece la carpeta temporal donde se almacenara la imagen.
        /// </summary>
        private const string folder = "C:\\ImagesTemp";

        /// <summary>
        /// Establece el nombre y extencion de la imagen que se almacenara. Por defecto es .JPEG.
        /// </summary>
        private const string file = "temp.jpg";

        /// <summary>
        /// Estabelce la ruta y el nombre del archivo completo.
        /// </summary>
        private const string rutaYArchivo = folder + "\\" + file;

        /// <summary>
        /// Objeto para manipulacion de colores.
        /// </summary>
        private ElColor color;

        /// <summary>
        /// Objeto para almancenar medidas.
        /// </summary>
        private ValorUnidadMedida medida;

        /// <summary>
        /// Array para almacenar objetos de medida.
        /// </summary>
        private List<ValorUnidadMedida> lstMedida;

        /// <summary>
        /// Array para almacenar objeto de color.
        /// </summary>
        private List<ElColor> listaColor;

        /// <summary>
        /// Tabla para almancenar datos en memoria.
        /// </summary>
        private DataTable miTabla;

        /// <summary>
        /// Objeto que estructura criterios de consulta.
        /// </summary>
        private Consulta miConsulta;

        /// <summary>
        /// Objeto que estructura criterios de consulta.
        /// </summary>
        private ConsultaCategoria miConsultaCategoria;

        /// <summary>
        /// Objeto que estructura criterios de consulta combinada.
        /// </summary>
        private ConsultaCombinada miConsultaCombinada;

        /// <summary>
        /// Obtiene o establece el valor que indica si se configuro color para el formulario
        /// </summary>
        private bool EnableColor = false;

        /// <summary>
        /// Obtiene o establece el valor que indica si el Formulario de edicio de producto se encuentra abierto.
        /// </summary>
        private bool FormEditOpen { set; get; }

        #endregion

        #region Formularios de extencion

        /// <summary>
        /// Formulario para la asignacion de Marca
        /// </summary>
        private Configuracion.Marcas.frmMarca frmMiMarca;

        /// <summary>
        /// Formulario para la asignacion de Categoria.
        /// </summary>
        private Categoria.FrmCategoria frmMiCategoria;

        #endregion

        #region Atributos de Validacion

        /// <summary>
        /// Indica si el Formulario es usado como extencion de otro Formulario.
        /// </summary>
        public bool Extencion = false;

        /// <summary>
        /// Obtiene o establece la condición que indica si se trata de otra edición en el Form.
        /// </summary>
        public bool Edit = false;

        /// <summary>
        /// Objeto para mostrar errores de validacion al usuario.
        /// </summary>
        private ErrorProvider miError;

        /// <summary>
        /// Establece la condicion para guardar.
        /// </summary>
        private bool codigoMatch = false,
                     barraMatch = false,
                     referenciaMatch = false,
                     nombreMatch = false,
                     descripcionMatch = false,
                     utilidadMatch = false,
                     valorVentaMatch = false,
                     presentacionMatch = false,
                     minimaMatch = false,
                     maximaMatch = false;

        /// <summary>
        /// Representan mensajes de requerido o formato incorrecto
        /// </summary>
        private const string
            codigoRequerido = "El campo Codigo es Requerido.",
            nombreRequerido = "El campo Nombre es Requerido.",
            valorVentaRequerido = "El campo Valor de Venta es Requerido.",
            codigoFormato = "El Codigo que ingreso tiene formato incorrecto.",
            barraFormato = "El Codigo de Barras que ingreso tiene formato incorrecto.",
            referenciaFormato = "La Referencia que ingreso tiene formato incorrecto.",
            nombreFormato = "El Nombre que ingreso tiene formato incorrecto.",
            descripcionFormato = "La Descripcion que ingreso tiene formato incorrecto.",
            utilidadFormato = "El valor de la Utilidad que ingreso tiene formato incorrecto.",
            valorVentaFormato = "El Valor de Venta que ingreso tiene formato incorrecto.",
            presentacionFormato = "El valor de la Presentacion que ingreso tiene formato incorrecto.",
            minimaFormato = "La cantidad Minima que ingreso tiene formato incorrecto.",
            maximaFormato = "La Cantidad Maxima que ingreso tiene formato incorrecto.",
            codigoExiste = "El codigo que ingreso ya existe en la base de datos.",
            barrasExiste = "El codigo de barras que ingreso ya existe en la base de datos.";

        #endregion

        #region Propiedades de paginacion

        /// <summary>
        /// Obteien o establece el numero que indica que iteracion se realizo.
        /// </summary>
        private int iteracion;

        /// <summary>
        /// Obtiene o establece el valor del registro a segir o registro base.
        /// </summary>
        private int rowProducto;

        /// <summary>
        /// Obtiene o establece el numero maximo de registro a cargar.
        /// </summary>
        private int rowMaxProducto;

        /// <summary>
        /// Obtiene o establece el total de registros en la base de datos.
        /// </summary>
        private long totalRowProducto;

        /// <summary>
        /// Obtiene o establece el numero total de paginas que componen la consulta.
        /// </summary>
        private long paginasProducto;

        /// <summary>
        /// Obtiene o establece el numero de la pagina actual.
        /// </summary>
        private int currentPageProducto;

        /// <summary>
        /// Obtiene o establece el valor del codigo del producto.
        /// </summary>
        private string CodigoProducto;

        /// <summary>
        /// Obtiene o establece el valor del nombre del producto.
        /// </summary>
        private string NombreProducto;

        /// <summary>
        /// Obtiene o establece el valor que indica si es una consulta de producto por Categoria.
        /// </summary>
        private bool SearchCategoria;

        /// <summary>
        /// Obtiene o establece el valor que indica si es una consulta de producto por Marca.
        /// </summary>
        private bool SearchMarca;

        /// <summary>
        /// Obtiene o establece el nombre de la categoria.
        /// </summary>
        private string NombreCategoria;

        /// <summary>
        /// Obtiene o establece el valor que indica si se trata de una consulta combinada.
        /// </summary>
        private bool BusquedaCombinada;

        /// <summary>
        /// Obtiene o establece el nombre de la referencia buscada.
        /// </summary>
        private string SearchReferencia;

        /// <summary>
        /// Obtiene o establece el valor que indica si se usa color en la consulta.
        /// </summary>
        private bool ColorChecked;

        /// <summary>
        /// Obtiene o establece el valor que indica si se usa codigo interno de producto en la consulta.
        /// </summary>
        private bool Code;

        /// <summary>
        /// Obtiene o establece el valor de la Marca en una consulta.
        /// </summary>
        private string Marca;

        /// <summary>
        /// Obtiene o establece el valor de la Talla en una consulta.
        /// </summary>
        private string Talla;

        /// <summary>
        /// Obtiene o establece el valor que indica si se usa Talla en la consulta.
        /// </summary>
        private bool Sixe;

        /// <summary>
        /// Obtiene o establece el valor que indica si se usa producto en la consulta.
        /// </summary>
        private bool Product;

        #endregion

        #endregion

        public FrmIngresarProducto()
        {
            InitializeComponent();

            SearchCategoria = false;
            miBussinesIva = new BussinesIva();
            miBussinesDescuento = new BussinesDescuento();
            miBussinesRecargo = new BussinesRecargo();
            bussinesUnidadMedida = new BussinesUnidadMedida();
            miBussinesValorUnidad = new BussinesValorUnidadMedida();
            miBussinesColor = new BussinesColor();
            miBussinesProducto = new BussinesProducto();

            miError = new ErrorProvider();

            EnableColor = Convert.ToBoolean( AppConfiguracion.ValorSeccion("color") );

            rowMaxProducto = 10;
            miTabla = new DataTable();
        }

        private void FrmIngresarProducto_Load(object sender, EventArgs e)
        {
            miBtnTexto.SetToolTip(btnBuscarCategoriaIngresarProd, "Buscar Categoria");
            miBtnTexto.SetToolTip(btnBuscarMarca, "Buscar Marca");
            miBtnTexto.SetToolTip(btnSelecionarColor, "Seleccionar Color");
            miBtnTexto.SetToolTip(btnEliminarColor, "Eliminar Color");

            this.cbAplicarPrecio.DataSource = aplicaPrecio.lista();
            CrearDirectorio();
            CargarIva();
            CargarUnidadMedida();
            CargarTallas();
            HabilitarColor();
            CrearTabla();

            CargarDescuentosYrecargos();

            this.dgvMedidaColor.AutoGenerateColumns = false;
                        
            //CompletaEventos.Completa += new CompletaEventos.CompletaAccion(CompletaEventos_Completo);
            CompletaEventos.Completam += new CompletaEventos.CompletaAccionm(CompletaEventosm_Completo);

            //this.dgvConsultaProducto.AutoGenerateColumns = false;

            miConsulta = new Consulta();
            cbConsulta.DataSource = miConsulta.lista1;
            cbConsulta1.DataSource = miConsulta.lista2;

            miConsultaCategoria = new ConsultaCategoria();
            cbConsutlaCategoria.DataSource = miConsultaCategoria.lista1;
            cbConsutlaCategoria1.DataSource = miConsultaCategoria.lista2;

            miConsultaCombinada = new ConsultaCombinada();
            cbBusquedaCombinada.DataSource = miConsultaCombinada.lista;
            cbBusquedaCombinada1.DataSource = miConsultaCombinada.lista1;
        }

        #region Crear Producto

        private void tsbGuardarProducto_Click(object sender, EventArgs e)
        {
            ValidacionGuardar();
            if (codigoCategoria.Equals(""))
            {
                miError.SetError(btnBuscarCategoriaIngresarProd,
                    "La Categoria del Producto es requerida.");
            }
            if (lbDescuento.SelectedItems.Count == 0)
            {
                lbDescuento.SelectedIndex = 0;
            }
            if (lbRecargo.SelectedItems.Count == 0)
            {
                lbRecargo.SelectedIndex = 0;
            }
            if (rbtnTalla.Checked && lstbTalla.SelectedItems.Count == 0)
            {
                miError.SetError(lstbTalla, "Debe seleccionar al menos una talla.");
            }
            else
            {
                miError.SetError(lstbTalla, null);
            }
            if (codigoMatch &&
                barraMatch &&
                referenciaMatch &&
                nombreMatch &&
                descripcionMatch &&
                utilidadMatch &&
                valorVentaMatch &&
                presentacionMatch &&
                minimaMatch &&
                maximaMatch &&
                !codigoCategoria.Equals("") &&
                !(rbtnTalla.Checked && lstbTalla.SelectedItems.Count == 0))
            {
                CargarProducto();
                try
                {
                    miBussinesProducto.InsertarProducto(miProducto);
                    MessageBox.Show("Los datos se almacenaron correctamente.", "Producto", 
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LimpiarCampos();
                    txtCodigoInternoProducto.Focus();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Producto", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void tsbSalirIngresarProd_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void llGenerarCodigoInterno_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                txtCodigoInternoProducto.Text = Convert.ToString(
                    miBussinesProducto.CapturarCodigoInterno());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            txtCodigoInternoProducto_Validating(null, null);
        }

        private void llGenerarCodigoBarrasProducto_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                txtCodigoBarrasProducto.Text = miBussinesProducto.CapturarCodbarras();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnBuscarCategoriaIngresarProd_Click(object sender, EventArgs e)
        {
            frmMiCategoria = new Categoria.FrmCategoria();
            frmMiCategoria.TblCategoria.SelectTab(1);
            frmMiCategoria.CargarGridCategorias();
            frmMiCategoria.Extencion = true;
            frmMiCategoria.Show();
        }

        private void btnBuscarCategoriaIngresarProd_Validating(object sender, CancelEventArgs e)
        {
            if (!codigoCategoria.Equals(""))
            {
                miError.SetError(btnBuscarCategoriaIngresarProd, null);
            }
        }

        private void btnBuscarMarca_Click(object sender, EventArgs e)
        {
            frmMiMarca = new Configuracion.Marcas.frmMarca();
            frmMiMarca.CargaGrillaMarca();
            frmMiMarca.Extension = true;
            frmMiMarca.Show();
        }

        private void rbtnUnidadMedida_CheckedChanged(object sender, EventArgs e)
        {
            if (rbtnUnidadMedida.Checked)
            {
                for (int i = 1; i < lstbTalla.Items.Count; i++)
                {
                    lstbTalla.SetSelected(i, false);
                }
                lstbTalla.Enabled = false;
                lbUnidadMedida.Enabled = true;
                lbValorMedida.Enabled = true;
                pMedidaColor.Visible = false;
            }
            LimpiarGridMedidaColor();
        }

        private void rbtnTalla_CheckedChanged(object sender, EventArgs e)
        {
            if (rbtnTalla.Checked)
            {
                lstbTalla.Enabled = true;
                lbUnidadMedida.Enabled = false;
                lbValorMedida.Enabled = false;
                pMedidaColor.Visible = false;
            }
            LimpiarGridMedidaColor();
        }

        private void lbUnidadMedida_SelectedValueChanged(object sender, EventArgs e)
        {
            int idUnidadMedida = Convert.ToInt32(this.lbUnidadMedida.SelectedValue);
            CargarValorUnidadMedida(idUnidadMedida);
            this.pMedidaColor.Visible = false;
            LimpiarGridMedidaColor();
        }

        private void lbValorMedida_SelectedValueChanged(object sender, EventArgs e)
        {
            this.pMedidaColor.Visible = false;
            LimpiarGridMedidaColor();
        }

        private void lstbTalla_SelectedValueChanged(object sender, EventArgs e)
        {
            this.pMedidaColor.Visible = false;
            LimpiarGridMedidaColor();
        }

        private void btnOpcionColor_Click(object sender, EventArgs e)
        {
            this.pMedidaColor.Visible = true;
            lstMedida = new List<ValorUnidadMedida>();
            if (rbtnUnidadMedida.Checked)
            {
                medida = (ValorUnidadMedida)
                    this.lbValorMedida.SelectedItem;
                lstMedida.Add(medida);
            }
            else
            {
                foreach (DataRowView view in lstbTalla.SelectedItems)
                {
                    medida = new ValorUnidadMedida();
                    medida.IdValorUnidadMedida = (int)view.Row["idvalor_unidad_medida"];
                    medida.DescripcionValorUnidadMedida = (string)view.Row["descripcionvalor_unidad_medida"];
                    lstMedida.Add(medida);
                }
            }
            //lstMedida.Reverse();
            cbMedida.DataSource = lstMedida;
        }

        private void btnSelecionarColor_Click(object sender, EventArgs e)
        {
            this.gbSelecionarColor.Visible = true;
            CargarGridColor();
        }

        private void btnEliminarColor_Click(object sender, EventArgs e)
        {
            if (dgvMedidaColor.RowCount != 0)
            {
                DialogResult rta = MessageBox.Show("¿Está seguro de eliminar el Color?",
                    "Producto", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (rta.Equals(DialogResult.Yes))
                {
                    var idMedida = (int)dgvMedidaColor.CurrentRow.Cells["IdMedida"].Value;
                    var idColor = (int)dgvMedidaColor.CurrentRow.Cells["IdColor"].Value;
                    var query = from datos in miTabla.AsEnumerable()
                                where datos.Field<int>("IdMedida") == idMedida &&
                                      datos.Field<int>("IdColor") == idColor
                                select datos;
                    DataRow del = null;
                    foreach (DataRow row in query)
                    {
                        del = row;
                    }
                    miTabla.Rows.Remove(del);
                }
            }
            else
            {
                OptionPane.MessageInformation("No hay colores a eliminar.");
            }
        }

        private void btnAgregarColor_Click(object sender, EventArgs e)
        {
            ElColor miColor = new ElColor();
            miColorDialog = new ColorDialog();
            miColorDialog.AllowFullOpen = true;
            if (miColorDialog.ShowDialog() == DialogResult.OK)
            {
                if (!ExisteColor())
                {
                    miColor.MapaBits = ImagenComoString();
                    try
                    {
                        miBussinesColor.InsertarColor(miColor);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    CargarGridColor();
                }
                else
                {
                    MessageBox.Show("El color seleccionado ya existe.", "Producto",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btnElegirColor_Click(object sender, EventArgs e)
        {
            listaColor = new List<ElColor>();
            foreach (DataGridViewRow row in this.dgvListaColor.SelectedRows)
            {
                color = new ElColor();
                color.IdColor = (int)row.Cells[0].Value;
                color.Imagen = (Image)row.Cells[1].Value;
                listaColor.Add(color);
            }
            CargarGridMedidaColor();
            this.gbSelecionarColor.Visible = false;
        }

        private void btnCancelarColor_Click(object sender, EventArgs e)
        {
            this.gbSelecionarColor.Visible = false;
        }

        private void menuGrid_Click(object sender, EventArgs e)
        {
            dgvMedidaColor.Rows.RemoveAt(this.dgvMedidaColor.CurrentCell.RowIndex);
            var t = miTabla.Rows.Count;
        }

        private void txtCodigoInternoProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!Validacion.EsVacio(txtCodigoInternoProducto, miError, codigoRequerido))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.LetrasGuionNumeros, txtCodigoInternoProducto, miError, codigoFormato))
                {
                    if (ExisteCodigo(txtCodigoInternoProducto.Text))
                    {
                        codigoMatch = false;
                        miError.SetError(txtCodigoInternoProducto, codigoExiste);
                    }
                    else
                    {
                        codigoMatch = true;
                        miError.SetError(txtCodigoInternoProducto, null);
                    }
                }
                else
                    codigoMatch = false;
            }
            else
                codigoMatch = false;
        }

        private void txtCodigoBarrasProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtCodigoBarrasProducto.Text))
            {
                if (Validacion.ConFormato
                  (Validacion.TipoValidacion.Numeros, txtCodigoBarrasProducto, miError, barraFormato))
                {
                    if (ExisteCodigoBarras(txtCodigoBarrasProducto.Text))
                    {
                        barraMatch = false;
                        miError.SetError(txtCodigoBarrasProducto, barrasExiste);
                    }
                    else
                    {
                        barraMatch = true;
                        miError.SetError(txtCodigoBarrasProducto, null);
                    }
                }
                else
                    barraMatch = false;
            }
            else
                barraMatch = true;
        }

        private void txtReferencia_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtReferencia.Text))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.LetrasGuionNumeros, txtReferencia, miError, referenciaFormato))
                {
                    referenciaMatch = true;
                }
                else
                    referenciaMatch = false;
            }
            else
                referenciaMatch = true;
        }

        private void txtNombreProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!Validacion.EsVacio(txtNombreProducto, miError, nombreRequerido))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.PalabrasNumeroCaracter, txtNombreProducto, miError, nombreFormato))
                {
                    nombreMatch = true;
                }
                else
                    nombreMatch = false;
            }
            else
                nombreMatch = false;
        }

        private void txtDescripcionProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtDescripcionProducto.Text))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.PalabrasNumeroCaracter, txtDescripcionProducto, miError, descripcionFormato))
                {
                    descripcionMatch = true;
                }
                else
                    descripcionMatch = false;
            }
            else
                descripcionMatch = true;
        }

        private void txtUtilidadPorcentualProducto_Validating(object sender, CancelEventArgs e)
        {
            var id = (int)cbAplicarPrecio.SelectedValue;
            if (id == 1)
            {
                if (!String.IsNullOrEmpty(txtUtilidadPorcentualProducto.Text))
                {
                    if (Validacion.ConFormato
                        (Validacion.TipoValidacion.NumerosYPunto, txtUtilidadPorcentualProducto, miError, utilidadFormato))
                    {
                        utilidadMatch = true;
                    }
                    else
                        utilidadMatch = false;
                }
                else
                {
                    utilidadMatch = true;
                    miError.SetError(txtUtilidadPorcentualProducto, null);
                }
            }
            else
            {
                if (!Validacion.EsVacio(txtUtilidadPorcentualProducto, miError, "El campo Utilidad es requerido."))
                {
                    if (Validacion.ConFormato
                        (Validacion.TipoValidacion.NumerosYPunto, txtUtilidadPorcentualProducto, miError, utilidadFormato))
                    {
                        utilidadMatch = true;
                    }
                    else
                        utilidadMatch = false;
                }
                else
                    utilidadMatch = false;
            }
        }

        private void txtValorVentaProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!Validacion.EsVacio(txtValorVentaProducto, miError, valorVentaRequerido))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.Numeros, txtValorVentaProducto, miError, valorVentaFormato))
                {
                    valorVentaMatch = true;
                }
                else
                    valorVentaMatch = false;
            }
            else
                valorVentaMatch = false;
        }

        private void txtUnidadVentaProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!Validacion.EsVacio(txtUnidadVentaProducto, miError, "El campo de presentación es requerido."))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.Numeros, txtUnidadVentaProducto, miError, presentacionFormato))
                {
                    presentacionMatch = true;
                }
                else
                    presentacionMatch = false;
            }
            else
                presentacionMatch = false;
        }

        private void txtCantidadMinimaProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtCantidadMinimaProducto.Text))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.Numeros, txtCantidadMinimaProducto, miError, minimaFormato))
                {
                    minimaMatch = true;
                }
                else
                    minimaMatch = false;
            }
            else
                minimaMatch = true;
        }

        private void txtCntidadMaximaProducto_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtCantidadMaximaProducto.Text))
            {
                if (Validacion.ConFormato
                    (Validacion.TipoValidacion.Numeros, txtCantidadMaximaProducto, miError, maximaFormato))
                {
                    maximaMatch = true;
                }
                else
                    maximaMatch = false;
            }
            else
                maximaMatch = true;
        }

        /// <summary>
        /// Comprueba si el codigo existe en un registro de Producto.
        /// </summary>
        /// <param name="codigo">Codigo a comprobar.</param>
        /// <returns></returns>
        private bool ExisteCodigo(string codigo)
        {
            try
            {
                return miBussinesProducto.ExisteCodigo(codigo);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Proveedor", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        /// <summary>
        /// Comprueba si el codigo existe en un registro de Producto.
        /// </summary>
        /// <param name="codigo">Codigo a comprobar.</param>
        /// <returns></returns>
        private bool ExisteCodigoBarras(string codigo)
        {
            try
            {
                return miBussinesProducto.ExisteCodigoBarras(codigo);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Proveedor", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        /// <summary>
        /// Crea un directorio para la pertinencia temporal de archivos.
        /// </summary>
        private void CrearDirectorio()
        {
            try
            {
                if (!System.IO.Directory.Exists(folder))
                {
                    System.IO.Directory.CreateDirectory(folder);
                    System.IO.File.SetAttributes
                        (folder, System.IO.FileAttributes.Hidden);
                }
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
        }

        /// <summary>
        /// Cargar el DataGridView con la lista de colores.
        /// </summary>
        private void CargarGridColor()
        {
            this.dgvListaColor.AutoGenerateColumns = false;
            try
            {
                this.dgvListaColor.DataSource = miBussinesColor.ListadoDeColores();
            }
            catch (Exception ex)
            {
                MessageBox.Show
                    (ex.Message, "Producto", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Valida si un color existe en la base de datos.
        /// </summary>
        /// <returns></returns>
        private bool ExisteColor()
        {
            AlmacenarImagen();
            string stringColor = ImagenComoString();
            try
            {
                return miBussinesColor.ExisteColor(stringColor);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
        }

        /// <summary>
        /// Almacena el color seleccionado como una imagen en un archivo y carpeta temporal.
        /// </summary>
        private void AlmacenarImagen()
        {
            pbColor.Image = new Bitmap(pbColor.Width, pbColor.Height);
            Graphics grafico = Graphics.FromImage(pbColor.Image);
            grafico.Clear(miColorDialog.Color);
            pbColor.Refresh();
            Rectangle r = new Rectangle(new Point(0, 0),
                new Size(pbColor.Width - 1, pbColor.Height - 1));
            grafico.DrawRectangle(new Pen(System.Drawing.Color.Black, 1), r);
            pbColor.Refresh();
            pbColor.Image.Save(rutaYArchivo, System.Drawing.Imaging.ImageFormat.Jpeg);
        }

        /// <summary>
        /// Obtiene un string Base64 que representa el mapa de bits del color, de la imagen almacenada.
        /// </summary>
        /// <returns></returns>
        private string ImagenComoString()
        {
            string sBase64 = "";
            System.IO.FileStream fs = new System.IO.FileStream
                            (rutaYArchivo, System.IO.FileMode.Open);
            System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
            byte[] bytes = new byte[(int)fs.Length];
            try
            {
                br.Read(bytes, 0, bytes.Length);
                sBase64 = Convert.ToBase64String(bytes);
                return sBase64;
            }
            catch
            {
                MessageBox.Show("Ocurrio un error al cargar el Color. ", "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                return null;
            }
            finally
            {
                fs.Close();
                fs = null;
                br = null;
                bytes = null;
            }
        }

        /// <summary>
        /// Crea las columnas para la tabla (miTabla)
        /// </summary>
        private void CrearTabla()
        {
            miTabla.Columns.Add(new DataColumn("IdMedida", typeof(int)));
            miTabla.Columns.Add(new DataColumn("IdColor", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Medida", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Color", typeof(Image)));
        }

        private void CargarDescuentosYrecargos()
        {
            try
            {
                this.lbDescuento.DataSource = miBussinesDescuento.ListadoDescuento();
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            try
            {
                this.lbRecargo.DataSource = miBussinesRecargo.ListadoRecargo();
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
        }

        /// <summary>
        /// Cargar el comboBox con las medidas seleccionadas por el usuario.
        /// </summary>
        private void CargarGridMedidaColor()
        {
            ValorUnidadMedida medida = (ValorUnidadMedida)
                this.cbMedida.SelectedItem;
            foreach (ElColor color in listaColor)
            {
                DataRow row = miTabla.NewRow();
                row["IdMedida"] = medida.IdValorUnidadMedida;
                row["IdColor"] = color.IdColor;
                row["Medida"] = medida.DescripcionValorUnidadMedida;
                row["Color"] = color.Imagen;
                miTabla.Rows.Add(row);
            }
            this.dgvMedidaColor.DataSource = miTabla;
        }

        /// <summary>
        /// Remueve todos los registros de medida y color en el grid.
        /// </summary>
        private void LimpiarGridMedidaColor()
        {
            if (dgvMedidaColor.RowCount != 0)
            {
                var length = dgvMedidaColor.RowCount;
                for (int i = 0; i < length; i++)
                {
                    dgvMedidaColor.Rows.RemoveAt(0);
                }
            }
        }

        /// <summary>
        /// Valida de nuevo todos los campos del formulario.
        /// </summary>
        private void ValidacionGuardar()
        {
            txtCodigoInternoProducto_Validating(null, null);
            txtCodigoBarrasProducto_Validating(null, null);
            txtReferencia_Validating(null, null);
            txtNombreProducto_Validating(null, null);
            txtDescripcionProducto_Validating(null, null);
            txtUtilidadPorcentualProducto_Validating(null, null);
            txtValorVentaProducto_Validating(null, null);
            txtUnidadVentaProducto_Validating(null, null);
            txtCantidadMinimaProducto_Validating(null, null);
            txtCntidadMaximaProducto_Validating(null, null);
        }

        /// <summary>
        /// Cargar un objeto Producto con los datos del formulario.
        /// </summary>
        private void CargarProducto()
        {
            miProducto = new DTO.Clases.Producto();
            miProducto.CodigoInternoProducto = txtCodigoInternoProducto.Text;
            miProducto.CodigoBarrasProducto = txtCodigoBarrasProducto.Text;
            miProducto.ReferenciaProducto = txtReferencia.Text;
            miProducto.NombreProducto = txtNombreProducto.Text;
            miProducto.DescripcionProducto = txtDescripcionProducto.Text;
            miProducto.CodigoCategoria = codigoCategoria;
            miProducto.IdMarca = idMarca;
            if (!String.IsNullOrEmpty(txtUtilidadPorcentualProducto.Text))
                miProducto.UtilidadPorcentualProducto = Convert.ToDouble(txtUtilidadPorcentualProducto.Text);
            if (!String.IsNullOrEmpty(txtValorVentaProducto.Text))
                miProducto.ValorVentaProducto = Convert.ToInt32(txtValorVentaProducto.Text);
            if (Convert.ToInt32(cbAplicarPrecio.SelectedValue) == 1)
            {
                miProducto.AplicaPrecioPorcentaje = false;
            }
            miProducto.IdIva = Convert.ToInt32(cbIva.SelectedValue);
            if (!String.IsNullOrEmpty(txtUnidadVentaProducto.Text))
                miProducto.UnidadVentaProducto = Convert.ToInt32(txtUnidadVentaProducto.Text);
            if (!String.IsNullOrEmpty(txtCantidadMinimaProducto.Text))
                miProducto.CantidadMinimaProducto = Convert.ToInt32(txtCantidadMinimaProducto.Text);
            if (!String.IsNullOrEmpty(txtCantidadMaximaProducto.Text))
                miProducto.CantidadMaximaProducto = Convert.ToInt32(txtCantidadMaximaProducto.Text);
            if (chkCantDecimal.Checked)
            {
                miProducto.CantidadDecimal = true;
            }
            CargarDescuentos();
            CargarRecargos();

            if (miTabla.Rows.Count != 0)
            {
                miProducto.AplicaColor = true;
                CargarInventariosDeTabla();
            }
            else
            {
                miProducto.AplicaColor = false;
                CargarInventarios();
            }
            if (rbtnTalla.Checked)
                miProducto.AplicaTalla = true;
            else
                miProducto.AplicaTalla = false;
            CargarMedidas();
            miProducto.Descuentos = listaDescuentos;
            miProducto.Recargos = listaRecargos;
            miProducto.Medidas = medidas;
            miProducto.Inventarios = inventarios;
        }

        /// <summary>
        /// Limpia todos los campos del formulario restableciendolo.
        /// </summary>
        private void LimpiarCampos()
        {
            txtCodigoInternoProducto.Text = "";
            txtCodigoBarrasProducto.Text = "";
            txtReferencia.Text = "";
            txtNombreProducto.Text = "";
            txtDescripcionProducto.Text = "";
            codigoCategoria = "";
            txtCategoria.Text = "";
            idMarca = 0;
            txtNombreMarca.Text = "";
            txtUtilidadPorcentualProducto.Text = "";
            txtValorVentaProducto.Text = "";
            txtUnidadVentaProducto.Text = "";
            txtCantidadMinimaProducto.Text = "";
            txtCantidadMaximaProducto.Text = "";
            lbUnidadMedida.SetSelected(0, true);
            lbDescuento.SetSelected(0, true);
            for(int i = 1; i < lbDescuento.Items.Count; i++)
            {
                lbDescuento.SetSelected(i, false);
            }
            lbRecargo.SetSelected(0, true);
            for (int i = 1; i < lbRecargo.Items.Count; i++)
            {
                lbRecargo.SetSelected(i, false);
            }
            lstbTalla.SetSelected(0, true);
            for (int i = 1; i < lstbTalla.Items.Count; i++)
            {
                lstbTalla.SetSelected(i, false);
            }
            miTabla.Rows.Clear();
            listaDescuentos.Clear();
            listaRecargos.Clear();
            medidas.Clear();
            inventarios.Clear();
            pMedidaColor.Visible = false;
        }

        #endregion

        #region Consultas Producto

        private void tsbBuscarProducto_Click(object sender, EventArgs e)
        {
            //miDelegado delegado = new miDelegado(ListarTodos);
            //this.Invoke(delegado);
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 1;
            try
            {
                dgvConsultaProducto.AutoGenerateColumns = false;
                dgvConsultaProducto.DataSource = miBussinesProducto.ListarProductos
                    (rowProducto, rowMaxProducto);
                totalRowProducto = miBussinesProducto.RowsListarProductos();
                MostrarColumnasDataGrid(true, false, false, false);
                ComboBoxColumnMedida();
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        private void tsbtnCodigo_Click(object sender, EventArgs e)
        {
            this.gBCodigos.Enabled = true;
            this.gbBusquedaporCategoria.Enabled = false;
            this.gbBusquedaReferencia.Enabled = false;
            this.btnBuscarporCodigos.Enabled = true;
            BusquedaCombinada = false;
            MostrarColumnasDataGrid(true, false, false, false);
        }

        private void tsbBuscarPorCategoria_Click(object sender, EventArgs e)
        {
            this.gbBusquedaporCategoria.Enabled = true;
            this.gBCodigos.Enabled = false;
            this.gbBusquedaReferencia.Enabled = false;
            BusquedaCombinada = false;
            MostrarColumnasDataGrid(true, false, false, false);
        }

        private void tsbBuscarporMarca_Click(object sender, EventArgs e)
        {
            this.gbBusquedaReferencia.Enabled = true;
            this.gBCodigos.Enabled = true;
            this.gbBusquedaporCategoria.Enabled = false;
            this.btnBuscarporCodigos.Enabled = false;
            this.cbConsulta1.Enabled = false;
            BusquedaCombinada = true;
            if (!EnableColor)
            {
                lblIncluir.Enabled = false;
                lblIncluirColor.Enabled = false;
                cbIncluirColor.Enabled = false;
            }
            btnSearchMarca.Enabled = false;
        }

        private void tsbSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tsbVerDetalle_Click(object sender, EventArgs e)
        {
            if (dgvConsultaProducto.RowCount != 0)
            {
                frmDetalleProducto detalle = new frmDetalleProducto();
                detalle.MdiParent = this.MdiParent;
                detalle.CodigoProducto = (string)dgvConsultaProducto.CurrentRow.Cells[1].Value;
                detalle.Show();
            }
        }

        private void tsbEditar_Click(object sender, EventArgs e)
        {
            if (dgvConsultaProducto.RowCount != 0)
            {
                if (!FormEditOpen)
                {
                    frmEditarProducto FrmEditarProducto = new frmEditarProducto();
                    FrmEditarProducto.MdiParent = this.MdiParent;
                    FrmEditarProducto.CodigoProducto = (string)dgvConsultaProducto.CurrentRow.Cells[1].Value;
                    FrmEditarProducto.Show();
                    FormEditOpen = true;
                }
            }
        }

        private void tsbEliminar_Click(object sender, EventArgs e)
        {
            DialogResult rta = MessageBox.Show("¿Está seguro de eliminar el Producto?",
                "Producto", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (rta.Equals(DialogResult.Yes))
            {
                if (dgvConsultaProducto.RowCount != 0)
                {
                    var codigo = Convert.ToString(dgvConsultaProducto.CurrentRow.Cells[1].Value);
                    try
                    {
                        miBussinesProducto.EliminarProducto(codigo);
                        OptionPane.MessageInformation("El Producto se ha eliminado con exito.");
                    }
                    catch (Exception ex)
                    {
                        OptionPane.MessageError(ex.Message);
                    }
                }
            }
        }

        private void cbConsulta_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (Convert.ToInt32(this.cbConsulta.SelectedValue) == 2)
                this.cbConsulta1.Enabled = true;
            else
            {
                this.cbConsulta1.SelectedIndex = 0;
                this.cbConsulta1.Enabled = false;
            }
            txtConsulta.Focus();
        }

        private void cbConsulta1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            txtConsulta.Focus();
        }

        private void txtCodigo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter) && !BusquedaCombinada)
                btnBuscarporCodigos_Click(null, null);
        }

        private void btnBuscarporCodigos_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(txtConsulta.Text))
            {
                int criterio = Convert.ToInt32(cbConsulta.SelectedValue);
                int criterio1 = Convert.ToInt32(cbConsulta1.SelectedValue);
                dgvConsultaProducto.AutoGenerateColumns = false;

                if (criterio == 1)
                {
                    ConsultaPorCodigo(txtConsulta.Text);
                }
                else
                {
                    if (criterio == 2 && criterio1 == 1)
                    {
                        ConsultaNombre(txtConsulta.Text);
                    }
                    else
                    {
                        if (criterio == 2 && criterio1 == 2)
                        {
                            NombreProducto = txtConsulta.Text;
                            FiltroNombre(NombreProducto);
                        }
                    }
                } 
                if (this.dgvConsultaProducto.RowCount != 0)
                {
                    ComboBoxColumnMedida();
                //    AjustarCeldasGrid();
                }
                else
                    MessageBox.Show("No se encontraron registros en la consulta. ", "Producto",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
                MessageBox.Show("El campo de busqueda es requerido. ", "Producto",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void cbConsutlaCategoria_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (Convert.ToInt32(this.cbConsutlaCategoria.SelectedValue) == 2)
                this.cbConsutlaCategoria1.Enabled = true;
            else
            {
                this.cbConsutlaCategoria1.SelectedIndex = 0;
                this.cbConsutlaCategoria1.Enabled = false;
            }
        }

        private void txtBuscarporCategoria_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                if (!String.IsNullOrEmpty(txtBuscarporCategoria.Text))
                {
                    int criterio = Convert.ToInt32(this.cbConsutlaCategoria.SelectedValue);
                    int criterio1 = Convert.ToInt32(this.cbConsutlaCategoria1.SelectedValue);
                    dgvConsultaProducto.AutoGenerateColumns = false;
                    if (criterio == 1 && criterio1 == 1)
                    {
                        codigoCategoria = txtBuscarporCategoria.Text;
                        ConsultaPorCodigoCategoria(codigoCategoria);
                    }

                    if (criterio == 2 && criterio1 == 1)
                    {
                        NombreCategoria = txtBuscarporCategoria.Text;
                        ConsultaPorNombreCategoria(NombreCategoria);
                    }

                    if (criterio == 2 && criterio1 == 2)
                    {
                        NombreCategoria = txtBuscarporCategoria.Text;
                        FiltroPorNombreCategoria(NombreCategoria);
                    }

                    if (this.dgvConsultaProducto.RowCount == 0)
                    {
                        //AjustarCeldasGrid();
                        MessageBox.Show("No se encontraron registros en la consulta. ", "Producto",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                    MessageBox.Show("El campo de busqueda es requerido. ", "Producto",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnBuscarporCategoria_Click(object sender, EventArgs e)
        {
            frmMiCategoria = new Categoria.FrmCategoria();
            frmMiCategoria.TblCategoria.SelectTab(1);
            frmMiCategoria.CargarGridCategorias();
            frmMiCategoria.Extencion = true;
            frmMiCategoria.Show();
            SearchCategoria = true;
        }

        private void cbBusquedaCombinada_SelectionChangeCommitted(object sender, EventArgs e)
        {
            int id = Convert.ToInt32(cbBusquedaCombinada.SelectedValue);
            if (id == 1)
            {
                cbBusquedaCombinada1.DataSource = miConsultaCombinada.lista1;
                this.txtTalla.Enabled = false;
                btnSearchMarca.Enabled = false;
            }
            if (id == 2)
            {
                cbBusquedaCombinada1.DataSource = miConsultaCombinada.lista3;
                cbBusquedaCombinada1_SelectionChangeCommitted(null, null);
                btnSearchMarca.Enabled = true;
            }
            if (id == 3)
            {
                cbBusquedaCombinada1.DataSource = miConsultaCombinada.lista2;
                this.txtTalla.Enabled = false;
                btnSearchMarca.Enabled = false;
            }
            txtBusquedaNombreMarca.Focus();
        }

        private void cbBusquedaCombinada1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            int id = Convert.ToInt32(this.cbBusquedaCombinada1.SelectedValue);

            if (id == 2)
            {
                this.txtTalla.Enabled = true;
            }
            else
                this.txtTalla.Enabled = false;
            txtBusquedaNombreMarca.Focus();
        }

        private void txtBusquedaNombreMarca_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                if (!String.IsNullOrEmpty(txtBusquedaNombreMarca.Text))
                {
                    btnBusquedaCombinada_Click(null, null);
                }
                else
                {
                    MessageBox.Show("El campo de busqueda es requerido. ", "Producto",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                    txtBusquedaNombreMarca.Focus();
                }
            }
        }

        private void txtTalla_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                var criterio = Convert.ToInt32(cbBusquedaCombinada.SelectedValue);
                var criterio1 = Convert.ToInt32(cbBusquedaCombinada1.SelectedValue);
                if (criterio == 2 && criterio1 == 2)
                {
                    if (!String.IsNullOrEmpty(txtBusquedaNombreMarca.Text))
                    {
                        if (!String.IsNullOrEmpty(txtTalla.Text))
                        {
                            btnBusquedaCombinada_Click(null, null);
                            txtTalla.Focus();
                        }
                        else
                        {
                            OptionPane.MessageInformation("El campo de busqueda es requerido. ");
                            txtTalla.Focus();
                        }
                    }
                    else
                    {
                        OptionPane.MessageInformation("El campo de busqueda es requerido. ");
                        txtBusquedaNombreMarca.Focus();
                    }
                }
            }
        }

        private void btnSearchMarca_Click(object sender, EventArgs e)
        {
            Configuracion.Marcas.frmMarca frmMarca = new Configuracion.Marcas.frmMarca();
            frmMarca.CargaGrillaMarca();
            frmMarca.Extension = true;
            SearchMarca = true;
            frmMarca.Show();
        }

        private void btnBusquedaCombinada_Click(object sender, EventArgs e)
        {
            int criterioProducto = Convert.ToInt32(this.cbConsulta.SelectedValue);
            //int criterioProducto1 = Convert.ToInt32(this.cbConsulta1.SelectedValue);
            int criterio = Convert.ToInt32(this.cbBusquedaCombinada.SelectedValue);
            int criterio1 = Convert.ToInt32(this.cbBusquedaCombinada1.SelectedValue);
            dgvConsultaProducto.AutoGenerateColumns = false;

            if (criterio == 1)
            {
                if (!String.IsNullOrEmpty(txtBusquedaNombreMarca.Text))
                {
                    if (!String.IsNullOrEmpty(txtConsulta.Text))
                    {
                        if (criterioProducto == 1)
                        {
                            ConsultaProductoConReferencia
                                (txtConsulta.Text, null, txtBusquedaNombreMarca.Text, true);
                        }
                        else
                        {
                            ConsultaProductoConReferencia
                                (null, txtConsulta.Text, txtBusquedaNombreMarca.Text, false);
                        }
                    }
                    else
                        ConsultaPorReferencia(txtBusquedaNombreMarca.Text);
                }
                else
                {
                    MessageBox.Show("El campo de busqueda es requerido.", "Producto",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                if (criterio == 2 && criterio1 == 1)//consulta marca
                {
                    if (!String.IsNullOrEmpty(txtBusquedaNombreMarca.Text))
                    {
                        if (!String.IsNullOrEmpty(txtConsulta.Text))
                        {
                            if (criterioProducto == 1)
                            {
                                //con codigo de producto
                                ConsultaProductoConMarca
                                    (txtConsulta.Text, null, txtBusquedaNombreMarca.Text, null, true, false);
                            }
                            else
                            {
                                ///con nombre de producto
                                ConsultaProductoConMarca
                                    (null, txtConsulta.Text, txtBusquedaNombreMarca.Text, null, false, false);
                            }
                        }
                        else
                        {
                            //sin producto
                            ConsultaPorMarca(txtBusquedaNombreMarca.Text, null, false);
                        }
                    }
                    else
                    {
                        MessageBox.Show("El campo de busqueda es requerido.", "Producto",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    if (criterio == 2 && criterio1 == 2) //consulta marca con talla
                    {
                        if (!String.IsNullOrEmpty(txtBusquedaNombreMarca.Text) && !String.IsNullOrEmpty(txtTalla.Text))
                        {
                            if (!String.IsNullOrEmpty(txtConsulta.Text))//consulta con producto
                            {
                                if (criterioProducto == 1)//con codigo de producto
                                {
                                    ConsultaProductoConMarca
                                        (txtConsulta.Text, null, txtBusquedaNombreMarca.Text, txtTalla.Text, true, true);
                                }
                                else
                                {
                                    ConsultaProductoConMarca
                                        (null, txtConsulta.Text, txtBusquedaNombreMarca.Text, txtTalla.Text, false, true);
                                }
                            }
                            else//consulta sin producto
                            {
                                ConsultaPorMarca(txtBusquedaNombreMarca.Text, txtTalla.Text, true);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Los campos de busqueda es requerido.", "Producto",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else//consulta por talla
                    {
                        if (!String.IsNullOrEmpty(txtConsulta.Text))//consulta talla con producto
                        {
                            if (criterioProducto == 1)//con codigo producto
                            {
                                ConsultaProductoConTalla
                                    (txtConsulta.Text, null, txtBusquedaNombreMarca.Text, true, true, cbIncluirColor.Checked);
                            }
                            else//con nombre
                            {
                                ConsultaProductoConTalla
                                    (null, txtConsulta.Text, txtBusquedaNombreMarca.Text, true, false, cbIncluirColor.Checked);
                            }
                        }
                        else//consulta talla sola
                        {
                            ConsultaProductoConTalla
                                (null, null, txtBusquedaNombreMarca.Text, false, false, cbIncluirColor.Checked);
                        }
                    }
                }
            }

            /*if (criterio == 1)
            {
                //ConsultaPorReferencia(txtBusquedaNombreMarca.Text);
            }
            if (criterio == 2 && criterio1 == 2)
            {
                //ConsultaPorMarca(txtBusquedaNombreMarca.Text);
            }*/


            /**BussinesProducto mibussinesproducto = new BussinesProducto();
            try
            {

                string nombremarca = txtBusquedaNombreMarca.Text;
                dgvConsultaProducto.Visible = true;
                this.dgvConsultaProducto.AutoGenerateColumns = false;
                dgvConsultaProducto.DataSource = null;
                dgvConsultaProducto.DataSource = mibussinesproducto.ListarProductosMarca(nombremarca);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }*/
        }

        private void dgvConsultaProducto_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)
                    dgvConsultaProducto.Rows[e.RowIndex].Cells[e.ColumnIndex];
                dgvConsultaProducto.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
            }
            catch
            {
                dgvConsultaProducto.EditMode = DataGridViewEditMode.EditProgrammatically;
            }
        }

        private void btnInicio_Click(object sender, EventArgs e)
        {
            if (currentPageProducto > 1)
            {
                var paginaActual = currentPageProducto;
                for (int i = paginaActual; i > 1; i--)
                {
                    rowProducto = rowProducto - rowMaxProducto;
                    currentPageProducto--;
                }
                try
                {
                    if (iteracion == 1)
                    {
                        dgvConsultaProducto.DataSource = miBussinesProducto.ListarProductos
                                                        (rowProducto, rowMaxProducto);
                    }
                    else
                    {
                        if (iteracion == 2)
                        {
                            dgvConsultaProducto.DataSource = miBussinesProducto.FiltroNombre
                                        (NombreProducto, rowProducto, rowMaxProducto);
                        }
                        else
                        {
                            if (iteracion == 3)
                            {
                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorCodigoCategoria
                                            (codigoCategoria, rowProducto, rowMaxProducto);
                            }
                            else
                            {
                                if (iteracion == 4)
                                {
                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                                (NombreCategoria, rowProducto, rowMaxProducto, false);
                                }
                                else
                                {
                                    if (iteracion == 5)
                                    {
                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                                    (NombreCategoria, rowProducto, rowMaxProducto, true);
                                    }
                                    else
                                    {
                                        if (iteracion == 6)
                                        {
                                            dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorReferencia
                                                (SearchReferencia, rowProducto, rowMaxProducto, ColorChecked);
                                        }
                                        else
                                        {
                                            if (iteracion == 7)
                                            {
                                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoConReferencia
                                                    (CodigoProducto, NombreProducto, SearchReferencia, Code, ColorChecked, rowProducto, rowMaxProducto);
                                            }
                                            else
                                            {
                                                if (iteracion == 8)
                                                {
                                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                        (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                }
                                                else
                                                {
                                                    if (iteracion == 9)
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                        (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                    else
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorTalla
                                                        (CodigoProducto, NombreProducto, Talla, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                ComboBoxColumnMedida();
                lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
            }
        }

        private void btnAnterior_Click(object sender, EventArgs e)
        {
            ///Retrocede a la pagina anterior de la actual.
            if (currentPageProducto > 1)
            {
                try
                {
                    rowProducto = rowProducto - rowMaxProducto;
                    if (rowProducto <= 0)
                        rowProducto = 0;
                    if (iteracion == 1)
                    {
                        dgvConsultaProducto.DataSource = miBussinesProducto.ListarProductos
                            (rowProducto, rowMaxProducto);
                    }
                    else
                    {
                        if (iteracion == 2)
                        {
                            dgvConsultaProducto.DataSource = miBussinesProducto.FiltroNombre
                                 (NombreProducto, rowProducto, rowMaxProducto);
                        }
                        else
                        {
                            if (iteracion == 3)
                            {
                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorCodigoCategoria
                                (codigoCategoria, rowProducto, rowMaxProducto);
                            }
                            else
                            {
                                if (iteracion == 4)
                                {
                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                    (NombreCategoria, rowProducto, rowMaxProducto, false);
                                }
                                else
                                {
                                    if (iteracion == 5)
                                    {
                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                        (NombreCategoria, rowProducto, rowMaxProducto, true);
                                    }
                                    else
                                    {
                                        if (iteracion == 6)
                                        {
                                            dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorReferencia
                                                (SearchReferencia, rowProducto, rowMaxProducto, ColorChecked);
                                        }
                                        else
                                        {
                                            if (iteracion == 7)
                                            {
                                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoConReferencia
                                                (CodigoProducto, NombreProducto, SearchReferencia, Code, ColorChecked, rowProducto, rowMaxProducto);
                                            }
                                            else
                                            {
                                                if (iteracion == 8)
                                                {
                                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                    (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                }
                                                else
                                                {
                                                    if (iteracion == 9)
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                        (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                    else
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorTalla
                                                        (CodigoProducto, NombreProducto, Talla, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                ComboBoxColumnMedida();
                currentPageProducto--;
                lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
            }
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            ///Avanza a la pagina siguiente de la actual
            if (currentPageProducto < paginasProducto)
            {
                rowProducto = rowProducto + rowMaxProducto;
                try
                {
                    if (iteracion == 1)
                    {
                        dgvConsultaProducto.DataSource = miBussinesProducto.ListarProductos
                                                        (rowProducto, rowMaxProducto);
                        //ComboBoxColumnMedida();
                    }
                    else
                    {
                        if (iteracion == 2)
                        {
                            dgvConsultaProducto.DataSource = miBussinesProducto.FiltroNombre
                                        (NombreProducto, rowProducto, rowMaxProducto);
                        }
                        else
                        {
                            if (iteracion == 3)
                            {
                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorCodigoCategoria
                                            (codigoCategoria, rowProducto, rowMaxProducto);
                            }
                            else
                            {
                                if (iteracion == 4)
                                {
                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                                (NombreCategoria, rowProducto, rowMaxProducto, false);
                                }
                                else
                                {
                                    if (iteracion == 5)
                                    {
                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                                    (NombreCategoria, rowProducto, rowMaxProducto, true);
                                    }
                                    else
                                    {
                                        if (iteracion == 6)
                                        {
                                            dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorReferencia
                                                (SearchReferencia, rowProducto, rowMaxProducto, ColorChecked);
                                        }
                                        else
                                        {
                                            if (iteracion == 7)
                                            {
                                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoConReferencia
                                                    (CodigoProducto, NombreProducto, SearchReferencia, Code, ColorChecked, rowProducto, rowMaxProducto);
                                            }
                                            else
                                            {
                                                if (iteracion == 8)
                                                {
                                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                        (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                }
                                                else
                                                {
                                                    if (iteracion == 9)
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                        (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                    else
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorTalla
                                                        (CodigoProducto, NombreProducto, Talla, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                ComboBoxColumnMedida();
                currentPageProducto++;
                lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
            }
        }

        private void btnFinal_Click(object sender, EventArgs e)
        {
            ///Avanza hasta la ultima pagina de los registros.
            if (currentPageProducto < paginasProducto)
            {
                var paginaActual = currentPageProducto;
                for (int i = paginaActual; i < paginasProducto; i++)
                {
                    rowProducto = rowProducto + rowMaxProducto;
                    currentPageProducto++;
                }
                try
                {
                    if (iteracion == 1)
                    {
                        dgvConsultaProducto.DataSource = miBussinesProducto.ListarProductos
                                                        (rowProducto, rowMaxProducto);
                        //ComboBoxColumnMedida();
                    }
                    else
                    {
                        if (iteracion == 2)
                        {
                            dgvConsultaProducto.DataSource = miBussinesProducto.FiltroNombre
                                        (NombreProducto, rowProducto, rowMaxProducto);
                        }
                        else
                        {
                            if (iteracion == 3)
                            {
                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorCodigoCategoria
                                            (codigoCategoria, rowProducto, rowMaxProducto);
                            }
                            else
                            {
                                if (iteracion == 4)
                                {
                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                                (NombreCategoria, rowProducto, rowMaxProducto, false);
                                }
                                else
                                {
                                    if (iteracion == 5)
                                    {
                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombreCategoria
                                                    (NombreCategoria, rowProducto, rowMaxProducto, true);
                                    }
                                    else
                                    {
                                        if (iteracion == 6)
                                        {
                                            dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorReferencia
                                                (SearchReferencia, rowProducto, rowMaxProducto, ColorChecked);
                                        }
                                        else
                                        {
                                            if (iteracion == 7)
                                            {
                                                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoConReferencia
                                                    (CodigoProducto, NombreProducto, SearchReferencia, Code, ColorChecked, rowProducto, rowMaxProducto);
                                            }
                                            else
                                            {
                                                if (iteracion == 8)
                                                {
                                                    dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                        (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                }
                                                else
                                                {
                                                    if (iteracion == 9)
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                                                        (CodigoProducto, NombreProducto, Marca, Talla, Sixe, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                    else
                                                    {
                                                        dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorTalla
                                                        (CodigoProducto, NombreProducto, Talla, Product, Code, ColorChecked, rowProducto, rowMaxProducto);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                ComboBoxColumnMedida();
                lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
            }
        }

        /// <summary>
        /// Carga las medidas de acuerdo a los registros del DataGridView.
        /// </summary>
        private void ComboBoxColumnMedida()
        {
            var registro = 0;
            foreach (DataGridViewRow row in dgvConsultaProducto.Rows)
            {
                string codigo = Convert.ToString(row.Cells["Column2"].Value);
                var tabla = miBussinesValorUnidad.MedidasDeProducto(codigo);
                string miMedida = "";
                if (tabla.Rows.Count > 1)
                {
                    foreach (DataRow row_ in tabla.Rows)
                    {
                        miMedida = miMedida +
                            Convert.ToString(row_["descripcionvalor_unidad_medida"]) + ", ";
                    }
                }
                else
                {
                    foreach (DataRow row_ in tabla.Rows)
                    {
                        miMedida = Convert.ToString(row_["descripcionvalor_unidad_medida"]);
                    }
                }
                dgvConsultaProducto[7, registro].Value = miMedida;
                registro++;
            }
        }

        /// <summary>
        /// Visualiza o no las columans extras del DataGridView.
        /// </summary>
        /// <param name="medidaDropDown">Estado para la columna Medida de tipo DropDownList.</param>
        /// <param name="medidaText">Estado para la columna Medida de tipo TextBox.</param>
        /// <param name="referencia">Estado para la columna Referencia.</param>
        /// <param name="color">Estado para la columna Color.</param>
        private void MostrarColumnasDataGrid
            (bool medidaDropDown, bool medidaText, bool referencia, bool color)
        {
            dgvConsultaProducto.Columns["Column5"].Visible = medidaDropDown;
            dgvConsultaProducto.Columns["Medida2"].Visible = medidaText;
            dgvConsultaProducto.Columns["Referencia"].Visible = referencia;
            dgvConsultaProducto.Columns["ColumnColor"].Visible = color;
        }

        /// <summary>
        /// Cargar el GridView con el resultado de la consulta.
        /// </summary>
        /// <param name="codigo">Codigo Interno o de Barras a consultar.</param>
        private void ConsultaPorCodigo(string codigo) 
        {
            try
            {
                this.dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorCodigo(codigo);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
        }

        /// <summary>
        /// Cargar el gridView con el resultado de la consulta.
        /// </summary>
        /// <param name="nombre">Nombre a consultar.</param>
        private void ConsultaNombre(string nombre)
        {
            try
            {
                this.dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaPorNombre(nombre);
                //ComboBoxColumnMedida();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Cargar el gridView con el resultado de la consulta.
        /// </summary>
        /// <param name="nombre">Nombre a filtrar.</param>
        private void FiltroNombre(string nombre)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 2;
            try
            {
                this.dgvConsultaProducto.DataSource = miBussinesProducto.FiltroNombre
                    (nombre, rowProducto, rowMaxProducto);
                totalRowProducto = miBussinesProducto.RowsFiltroNombre(nombre);
                //ComboBoxColumnMedida();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta.
        /// </summary>
        /// <param name="codigo">Codigo de la categoria.</param>
        private void ConsultaPorCodigoCategoria(string codigo)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 3;
            try
            {
                this.dgvConsultaProducto.DataSource = miBussinesProducto.
                    ConsultaPorCodigoCategoria(codigo, rowProducto, rowMaxProducto);
                totalRowProducto = miBussinesProducto.RowsConsultaPorCodigoCategoria(codigo);
                ComboBoxColumnMedida();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta.
        /// </summary>
        /// <param name="nombre">Nombre de la categoria.</param>
        private void ConsultaPorNombreCategoria(string nombre)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 4;
            try
            {
                this.dgvConsultaProducto.DataSource = 
                    miBussinesProducto.ConsultaPorNombreCategoria(nombre, rowProducto, rowMaxProducto, false);
                totalRowProducto = miBussinesProducto.RowsConsultaPorNombreCategoria(nombre, false);
                ComboBoxColumnMedida();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta.
        /// </summary>
        /// <param name="nombre">Nombre de la categoria o parte de este.</param>
        private void FiltroPorNombreCategoria(string nombre)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 5;
            try
            {
                this.dgvConsultaProducto.DataSource =
                    miBussinesProducto.ConsultaPorNombreCategoria(nombre, rowProducto, rowMaxProducto, true);
                totalRowProducto = miBussinesProducto.RowsConsultaPorNombreCategoria(nombre, true);
                ComboBoxColumnMedida();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta Por referencia e indica si incluye color.
        /// </summary>
        /// <param name="referencia">Referencia a consultar.</param>
        private void ConsultaPorReferencia(string referencia)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 6;
            try
            {
                dgvConsultaProducto.DataSource =  miBussinesProducto.ConsultaProductoPorReferencia
                        (referencia, rowProducto, rowMaxProducto, cbIncluirColor.Checked);
                SearchReferencia = referencia;
                ColorChecked = cbIncluirColor.Checked;
                totalRowProducto = miBussinesProducto.RowsConsultaProductoPorReferencia
                    (referencia, cbIncluirColor.Checked);
                if (cbIncluirColor.Checked)
                {
                    MostrarColumnasDataGrid(false, true, true, true);
                }
                else
                {
                    MostrarColumnasDataGrid(true, false, true, false);
                    ComboBoxColumnMedida();
                }
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta de productos segun el codigo o el nombre y la referencia.
        /// </summary>
        /// <param name="codigo">Codigo del producto a consultar.</param>
        /// <param name="nombre">Nombre o parte de este del producto a consultar.</param>
        /// <param name="referencia">Referencia o parte de esta a consultar.</param>
        /// <param name="code">Indica si se consulta por Codigo del producto o no.</param>
        private void ConsultaProductoConReferencia
            (string codigo, string nombre, string referencia, bool code)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 7;
            try
            {
                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoConReferencia
                    (codigo, nombre, referencia, code, cbIncluirColor.Checked, 
                     rowProducto, rowMaxProducto);
                totalRowProducto = miBussinesProducto.RowsConsultaProductoConReferencia
                    (codigo, nombre, referencia, code, cbIncluirColor.Checked);
                CodigoProducto = codigo;
                NombreProducto = nombre;
                SearchReferencia = referencia;
                Code = code;
                ColorChecked = cbIncluirColor.Checked;
                if (cbIncluirColor.Checked)
                {
                    MostrarColumnasDataGrid(false, true, true, true);
                }
                else
                {
                    MostrarColumnasDataGrid(true, false, true, false);
                    ComboBoxColumnMedida();
                }
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta de productos segun la Marca.
        /// </summary>
        /// <param name="marca">Nombre o parte de la marca del producto a consultar.</param>
        /// <param name="talla">Talla o parte de esta a consultar.</param>
        /// <param name="size">Indica si la consulta incluye talla o no.</param>
        private void ConsultaPorMarca
            (string marca, string talla, bool size)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 8;
            try
            {
                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                    (null, null, marca, talla, size, false, false, cbIncluirColor.Checked, rowProducto, rowMaxProducto);
                totalRowProducto = miBussinesProducto.RowsConsultaProductoPorMarca(null, null, marca,
                    talla, size, false, false, cbIncluirColor.Checked);
                NombreProducto = null;
                CodigoProducto = null;
                Marca = marca;
                Talla = talla;
                Sixe = size;
                Product = false;
                Code = false;
                ColorChecked = cbIncluirColor.Checked;
                if (cbIncluirColor.Checked)
                {
                    MostrarColumnasDataGrid(false, true, true, true);
                }
                else
                {
                    if (!String.IsNullOrEmpty(talla))
                    {
                        MostrarColumnasDataGrid(false, true, true, false);
                    }
                    else
                    {
                        MostrarColumnasDataGrid(true, false, true, false);
                        ComboBoxColumnMedida();
                    }
                }
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta de productos segun la Marca.
        /// </summary>
        /// <param name="codigo">Codigo del producto a consultar.</param>
        /// <param name="nombre">Nombre o parte de este del producto a consultar.</param>
        /// <param name="marca">Marca o parte de esta a consultar.</param>
        /// <param name="talla">Talla o parte de esta a consultar.</param>
        /// <param name="code">Indica si se consulta por Codigo del producto o no.</param>
        /// <param name="size">Indica si la consulta incluye talla o no.</param>
        private void ConsultaProductoConMarca
            (string codigo, string nombre, string marca, string talla, bool code, bool size)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 9;
            try
            {
                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorMarca
                    (codigo, nombre, marca, talla, size, true, code, cbIncluirColor.Checked, rowProducto, rowMaxProducto);
                totalRowProducto = miBussinesProducto.RowsConsultaProductoPorMarca(codigo, nombre, marca, talla,
                    size, true, code, cbIncluirColor.Checked);
                CodigoProducto = codigo;
                NombreProducto = nombre;
                Marca = marca;
                Talla = talla;
                Sixe = size;
                Product = true;
                Code = code;
                ColorChecked = cbIncluirColor.Checked;
                if (cbIncluirColor.Checked)
                {
                    MostrarColumnasDataGrid(false, true, true, true);
                }
                else
                {
                    if (!String.IsNullOrEmpty(talla))
                    {
                        MostrarColumnasDataGrid(false, true, true, false);
                    }
                    else
                    {
                        MostrarColumnasDataGrid(true, false, true, false);
                        ComboBoxColumnMedida();
                    }
                }
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta de productos segun la Talla o Medida.
        /// </summary>
        /// <param name="codigo">Codigo del producto a consultar.</param>
        /// <param name="nombre">Nombre o parte de este del producto a consultar.</param>
        /// <param name="talla">Talla o parte de esta a consultar.</param>
        /// <param name="product">Indica si la consulta incluye Producto o no.</param>
        /// <param name="code">Indica si se consulta por Codigo del producto o no.</param>
        /// <param name="color">Indica si la consulta incluye color o no.</param>
        private void ConsultaProductoConTalla(string codigo, string nombre, string talla, 
            bool product, bool code, bool color)
        {
            rowProducto = 0;
            currentPageProducto = 1;
            iteracion = 10;
            try
            {
                dgvConsultaProducto.DataSource = miBussinesProducto.ConsultaProductoPorTalla
                    (codigo, nombre, talla, product, code, cbIncluirColor.Checked, rowProducto, rowMaxProducto);
                totalRowProducto = miBussinesProducto.RowsConsultaProductoPorTalla(codigo, nombre, talla,
                    product, code, cbIncluirColor.Checked);
                CodigoProducto = codigo;
                NombreProducto = nombre;
                Talla = talla;
                Product = product;
                Code = code;
                ColorChecked = cbIncluirColor.Checked;
                if (cbIncluirColor.Checked)
                {
                    MostrarColumnasDataGrid(false, true, true, true);
                }
                else
                {
                    if (!String.IsNullOrEmpty(talla))
                    {
                        MostrarColumnasDataGrid(false, true, true, false);
                    }
                    else
                    {
                        MostrarColumnasDataGrid(true, false, true, false);
                        ComboBoxColumnMedida();
                    }
                }
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasProducto = totalRowProducto / rowMaxProducto;
            if (totalRowProducto % rowMaxProducto != 0)
                paginasProducto++;
            if (currentPageProducto > paginasProducto)
                currentPageProducto = 0;
            lblStatusPaginaProducto.Text = currentPageProducto + " / " + paginasProducto;
        }

        #endregion

        /// <summary>
        /// Habilita la eleccion de color en el formulario segun la configuracion.
        /// </summary>
        private void HabilitarColor()
        {
            if (EnableColor)
            {
                btnOpcionColor.Visible = true;
                lblSeleccionarColor.Visible = true;
            }
        }

        /// <summary>
        /// Carga los valores del Iva en el Combo Box
        /// </summary>
        private void CargarIva()
        {
            try
            {
                cbIva.DataSource = miBussinesIva.ListadoIva();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Carga las unidades de medida en el List Box.
        /// </summary>
        private void CargarUnidadMedida()
        {
            try
            {
                lbUnidadMedida.DataSource = bussinesUnidadMedida.ListadoUnidadMedidaNoTalla();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Cargar las tallas en el ListBox.
        /// </summary>
        private void CargarTallas()
        {
            try
            {
                lstbTalla.DataSource = miBussinesValorUnidad.ListadoDeTallas();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Carga los Valores de las unidades de medida segun la medida en el List Box.
        /// </summary>
        /// <param name="idUnidadMedida"></param>
        private void CargarValorUnidadMedida(int idUnidadMedida)
        {
            try
            {
                lbValorMedida.DataSource =
                    miBussinesValorUnidad.ListadoValorUnidadMedida(idUnidadMedida);
                if (!EnableColor)
                {
                    lbValorMedida.SelectionMode = SelectionMode.One;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Carga el listado de Descuentos elegidos por el usuario.
        /// </summary>
        private void CargarDescuentos()
        {
            listaDescuentos = new List<Descuento>();
            foreach (Descuento d in lbDescuento.SelectedItems)
            {
                listaDescuentos.Add(d);
            }
        }

        /// <summary>
        /// Carga el listado de Recargos elegidos por el usuario.
        /// </summary>
        private void CargarRecargos() 
        {
            listaRecargos = new List<Recargo>();
            foreach (Recargo r in lbRecargo.SelectedItems)
            {
                listaRecargos.Add(r);
            }
        }

        /// <summary>
        /// Carga las medidas del producto seleccionadas por el usuario.
        /// </summary>
        private void CargarMedidas()
        {
            medidas = new List<ValorUnidadMedida>();
            /*foreach (DTO.Clases.Inventario i in inventarios)
            {
                var medida = new ValorUnidadMedida();
                medida.IdValorUnidadMedida = i.IdMedida;
                medidas.Add(medida);
            }*/
            if (rbtnUnidadMedida.Checked)
            {
                var medida = new ValorUnidadMedida();
                medida.IdValorUnidadMedida = Convert.ToInt32(this.lbValorMedida.SelectedValue);
                medidas.Add(medida);
            }
            else
            {
                foreach (DataRowView view in lstbTalla.SelectedItems)
                {
                    var medida = new ValorUnidadMedida();
                    medida.IdValorUnidadMedida = Convert.ToInt32(view.Row["idvalor_unidad_medida"]);
                    medidas.Add(medida);
                }
            }
        }

        /// <summary>
        /// Carga la relacion de inventario del producto
        /// </summary>
        private void CargarInventarios()
        {
            inventarios = new List<DTO.Clases.Inventario>();
            if (rbtnUnidadMedida.Checked)
            {
                var inventario = new DTO.Clases.Inventario();
                inventario.IdMedida = Convert.ToInt32(this.lbValorMedida.SelectedValue);
                inventarios.Add(inventario);
            }
            else
            {
                foreach (DataRowView view in lstbTalla.SelectedItems)
                {
                    var inventario = new DTO.Clases.Inventario();
                    inventario.IdMedida = Convert.ToInt32(view.Row["idvalor_unidad_medida"]);
                    inventarios.Add(inventario);
                }
            }
        }

        /// <summary>
        /// Carga la relacion de medida y color en inventario del producto.
        /// </summary>
        private void CargarInventariosDeTabla()
        {
            inventarios = new List<DTO.Clases.Inventario>();
            foreach (DataRow row in miTabla.Rows)
            {
                var inventario = new DTO.Clases.Inventario();
                inventario.IdMedida = row.Field<int>("IdMedida");
                inventario.IdColor = row.Field<int>("IdColor");
                inventarios.Add(inventario);
            }
        }

        /// <summary>
        /// Completa la transferencia de datos de Marca.
        /// </summary>
        /// <param name="args"></param>
        void CompletaEventosm_Completo(CompletaArgumentosDeEventom args)
        {
            try
            {
                TransferirMarca m = (TransferirMarca)args.MiMarca;
                if (SearchMarca)
                {
                    txtBusquedaNombreMarca.Text = m.NombreMarca;
                    SearchMarca = false;
                    txtBusquedaNombreMarca.Focus();
                }
                else
                {
                    idMarca = Convert.ToInt32(m.IdMarca);
                    txtNombreMarca.Text = Convert.ToString(m.NombreMarca);
                }
            }
            catch { }

            try
            {
                DTO.Clases.Categoria c = (DTO.Clases.Categoria)args.MiMarca;
                if (SearchCategoria)
                {
                    var criterio = Convert.ToInt32(cbConsutlaCategoria.SelectedValue);
                    if (criterio == 1)
                    {
                        txtBuscarporCategoria.Text = c.CodigoCategoria;
                    }
                    else
                    {
                        txtBuscarporCategoria.Text = c.NombreCategoria;
                    }
                    txtBuscarporCategoria.Focus();
                    SearchCategoria = false;
                }
                else
                {
                    codigoCategoria = c.CodigoCategoria;
                    txtCategoria.Text = c.NombreCategoria;
                }
            }
            catch { }

            try
            {
                FormEditOpen = (bool)args.MiMarca;
            }
            catch { }
        }

        private void FrmIngresarProducto_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (Edit)
            {
                CompletaEventos.CapturaEventoEditProveedor(false);
            }
        }

        private void dgvConsultaProducto_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvConsultaProducto.RowCount != 0 && Extencion)
            {
                var producto = new DTO.Clases.Producto();
                producto.CodigoInternoProducto = Convert.ToString
                    (dgvConsultaProducto.CurrentRow.Cells["Column2"].Value);
                producto.NombreProducto = Convert.ToString
                    (dgvConsultaProducto.CurrentRow.Cells["Column4"].Value);
                if (Edit)
                {
                    CompletaEventos.CapturaEventoEditProveedor(producto);
                }
                else
                {
                    CompletaEventos.CapturaEventom(producto);
                }
                Extencion = false;
                this.Close();
            }
        }

    }

    /// <summary>
    /// Representa una clase para Aplicar precios
    /// </summary>
    internal class AplicarPrecio
    {
        /// <summary>
        /// Obtiene o establece el Id
        /// </summary>
        public int Id { set; get; }

        /// <summary>
        /// Obtiene o establece el valor
        /// </summary>
        public string Valor { set; get; }

        /// <summary>
        /// Obtiene una lista de las opciones para aplicar precio
        /// </summary>
        /// <returns></returns>
        public List<AplicarPrecio> lista()
        {
            List<AplicarPrecio> lst = new List<AplicarPrecio>();
            lst.Add
            (
                new AplicarPrecio
                {
                    Id = 1,
                    Valor = "Valor"
                }
            );

            lst.Add
            (
                new AplicarPrecio
                {
                    Id = 2,
                    Valor = "Porcentaje"
                }
            );

            return lst;
        }
    }

    /// <summary>
    /// Representa una clase para estructura criterios de consulta.
    /// </summary>
    internal class Consulta
    {
        /// <summary>
        /// Obtiene o establece el listado de criterios primarios.
        /// </summary>
        public List<Criterio> lista1 { set; get; }

        /// <summary>
        /// Obtiene o establece el listado de criterios secundarios.
        /// </summary>
        public List<Criterio> lista2 { set; get; }

        /// <summary>
        /// Inicaliza una nueva instancia de la clase Consulta.
        /// </summary>
        public Consulta()
        {
            this.lista1 = new List<Criterio>();
            this.lista1.Add(
                new Criterio
                {
                    Id = 1,
                    Nombre = "Codigo"
                });
            this.lista1.Add(
                new Criterio
                {
                    Id = 2,
                    Nombre = "Nombre"
                });

            this.lista2 = new List<Criterio>();
            this.lista2.Add(
                new Criterio
                {
                    Id = 1,
                    Nombre = "Que sea Igual"
                });
            this.lista2.Add(
                new Criterio
                {
                    Id = 2,
                    Nombre = "Que contenga"
                });
        }
    }

    /// <summary>
    /// Representa una Clase para estructurar Criterios de consulta.
    /// </summary>
    internal class ConsultaCategoria
    {
        /// <summary>
        /// Obtiene o establece el listado de criterios primarios.
        /// </summary>
        public List<Criterio> lista1 { set; get; }

        /// <summary>
        /// Obtiene o establece el listado de criterios secundarios.
        /// </summary>
        public List<Criterio> lista2 { set; get; }

        /// <summary>
        /// Inicaliza una nueva instancia de la clase ConsultaCategoria.
        /// </summary>
        public ConsultaCategoria()
        {
            this.lista1 = new List<Criterio>();
            this.lista1.Add(
                new Criterio
                {
                    Id = 1,
                    Nombre = "Codigo"
                });
            this.lista1.Add(
                new Criterio
                {
                    Id = 2,
                    Nombre = "Nombre"
                });

            this.lista2 = new List<Criterio>();
            this.lista2.Add(
                new Criterio
                {
                    Id = 1,
                    Nombre = "Que se Igual"
                });
            this.lista2.Add(
                new Criterio
                {
                    Id = 2,
                    Nombre = "Que Contenga"
                });
        }
    }

    /// <summary>
    /// Representa una clase para la estructura de consultas combinadas
    /// </summary>
    internal class ConsultaCombinada
    {
        /// <summary>
        /// Obtiene o establece el listado de criterios primarios.
        /// </summary>
        public List<Criterio> lista { set; get; }

        /// <summary>
        /// Obtiene o establece el listado de criterios secundarios.
        /// </summary>
        public List<Criterio> lista1 { set; get; }

        /// <summary>
        /// Obtiene o establece el listado de criterios terciarios.
        /// </summary>
        public List<Criterio> lista2 { set; get; }

        /// <summary>
        /// Obtiene o establece el listado de criterios cuaternarios.
        /// </summary>
        public List<Criterio> lista3 { set; get; }

        /// <summary>
        /// Inicializa una nueva instacia de la clase ConsultaCombinada
        /// </summary>
        public ConsultaCombinada()
        {
            Criterio SinCombinacion = new Criterio { Id = 1, Nombre = "" };
            Criterio Marca = new Criterio { Id = 2, Nombre = "Marca" };
            Criterio Talla = new Criterio { Id = 2, Nombre = "Medida o Talla" };

            this.lista = new List<Criterio>();
            this.lista.Add(
                new Criterio
                {
                    Id = 1,
                    Nombre = "Por Referencia"
                });
            this.lista.Add(
                new Criterio
                {
                    Id = 2,
                    Nombre = "Por Marca"
                });
            this.lista.Add(
                new Criterio
                {
                    Id = 3,
                    Nombre = "Por Medida o Talla"
                });

            this.lista1 = new List<Criterio>();
            this.lista1.Add(SinCombinacion);

            this.lista2 = new List<Criterio>();
            this.lista2.Add(SinCombinacion);
            //this.lista2.Add(Marca);

            this.lista3 = new List<Criterio>();
            this.lista3.Add(SinCombinacion);
            this.lista3.Add(Talla);
            
        }

    }

    /// <summary>
    /// Representa una clase que conforman los criterios.
    /// </summary>
    internal class Criterio
    {
        public int Id { set; get; }
        public string Nombre { set; get; }
    }
}